package Interfaz;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.logging.*;
import javax.swing.*;
import Logica.*;

@SuppressWarnings("serial")
public class Principal extends JFrame implements ActionListener {

	// Se declara los botones
	private JMenu menuPrincipal, menuJugar, menuIniciar, menuJugarDosJugadores;
	private JMenuBar menuBarra;
	private JMenuItem menuItemIngresar, menuItemRegistrar, menuItemJugar,
			menuItemSalir, menuItemCliente, menuItemServidor;
	private JLabel lblImagenMenu;

	public Principal() {
		// Se crea las variables
		menuPrincipal = new JMenu("Inicio");
		menuJugar = new JMenu("Jugar");
		menuIniciar = new JMenu("Iniciar");
		menuJugarDosJugadores = new JMenu("Dos Jugadores");
		menuBarra = new JMenuBar();
		menuItemIngresar = new JMenuItem("Ingresar");
		menuItemRegistrar = new JMenuItem("Registrar");
		menuItemJugar = new JMenuItem("Un jugador");
		menuItemCliente = new JMenuItem("Cliente");
		menuItemServidor = new JMenuItem("Servidor");
		menuItemSalir = new JMenuItem("Salir");
		lblImagenMenu = new JLabel(new ImageIcon("tenis.jpg"));

		// Se coloca las opciones a los Menu
		menuPrincipal.add(menuIniciar);
		menuPrincipal.add(menuJugar);
		menuIniciar.add(menuItemIngresar);
		menuIniciar.add(menuItemRegistrar);
		menuJugar.add(menuItemJugar);
		menuJugar.add(menuJugarDosJugadores);
		menuJugarDosJugadores.add(menuItemServidor);
		menuJugarDosJugadores.add(menuItemCliente);
		menuPrincipal.add(menuItemSalir);

		// Se coloca el menu a la Barra de Opciones
		menuBarra.add(menuPrincipal);

		// Se da las caracteristicas de la ventana
		this.setPreferredSize(new Dimension(700, 600));
		// this.setResizable(false);
		this.setVisible(true);
		this.setTitle("Principal");
		this.pack();
		this.setLocationRelativeTo(null);

		// Se coloca el menuBar a la ventana
		this.setJMenuBar(menuBarra);

		// Se agrega los listeners a las variables
		menuItemIngresar.addActionListener(this);
		menuItemRegistrar.addActionListener(this);
		menuItemJugar.addActionListener(this);
		menuItemCliente.addActionListener(this);
		menuItemServidor.addActionListener(this);
		menuItemSalir.addActionListener(this);
		menuItemJugar.setEnabled(false);
		menuItemCliente.setEnabled(false);
		menuItemServidor.setEnabled(false);
		menuJugarDosJugadores.setEnabled(false);

		// Se agrega la imagen para el menu
		this.add(lblImagenMenu);

		// Se posiciona la imagen para el menu
		lblImagenMenu.setBounds(0, 0, 700, 600);
	}

	public void setPantallaBienvenida(String nombre, String apellido) {
		JPanel panel = new JPanel();
		// panel.setBackground(new Color(256, 256, 256));
		JLabel texto = new JLabel("Bienvenido " + nombre + " " + apellido);
		panel.add(texto);
		texto.setBounds(panel.getWidth() / 2, panel.getHeight(),
				panel.getWidth(), 25);
		this.add(panel);
		panel.setBounds(0, 0, this.getWidth(), this.getHeight());
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// Si la opcion Ingresar es seleccionado
		if (e.getSource() == menuItemIngresar) {
			Ingresar ingresar = new Ingresar();
			ingresar.setVisible(true);
			// String nombre = ingresar.getNombre();
			// String apellido = ingresar.getApellido();
			// this.setPantallaBienvenida(nombre, apellido);
			// this.validate();
			menuItemJugar.setEnabled(true);
			menuItemCliente.setEnabled(true);
			menuItemServidor.setEnabled(true);
			menuJugarDosJugadores.setEnabled(true);
		}

		// Si la opcion Registrar es seleccionado
		if (e.getSource() == menuItemRegistrar) {
			new Registrar().setVisible(true);
		}

		// Si la opcion Reiniciar es seleccionado
		if (e.getSource() == menuItemJugar) {
			pintarJuego();
		}

		// Si la opcion Cliente es seleccionado
		if (e.getSource() == menuItemCliente) {
			this.dispose();
			Socket cliente;
			String ip = JOptionPane.showInputDialog(null, "Ingrese la ip del servidor."); 
			Cliente main = new Cliente(); 
	        
	        ExecutorService executor = Executors.newCachedThreadPool();
	 
	        try {
	            cliente = new Socket(InetAddress.getByName(ip), 2004); 
	            JOptionPane.showMessageDialog(null,"Conectado a :" + cliente.getInetAddress().getHostName());
	            PanelJuegoLAN panel = new PanelJuegoLAN(-1);
	            executor.execute(new RecibeCliente(cliente, main, panel));
	            executor.execute(new EnviaCliente(cliente, main, panel));
	        } catch (IOException ex) {
	            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
	        } 
	        finally {
	        }
	        executor.shutdown();
		}

		// Si la opcion Servidor es seleccionado
		if (e.getSource() == menuItemServidor) {
			this.dispose();
			ServerSocket servidor;
			Socket conexion;
			Servidor main = new Servidor(); //Instanciacion de la clase Principalchat
	        main.setLocationRelativeTo(null);   //Centrar el JFrame
	        main.setDefaultCloseOperation(EXIT_ON_CLOSE); //habilita cerrar la ventana
	        
	        ExecutorService executor = Executors.newCachedThreadPool(); //Para correr los threads

	        try {
	            servidor = new ServerSocket(2004, 100);
                conexion = servidor.accept(); //Permite al servidor aceptar conexiones        
                JOptionPane.showMessageDialog(null,"Conectado a : " + conexion.getInetAddress().getHostName());
                PanelJuegoLAN panel = new PanelJuegoLAN(1);
                //Ejecucion de los threads
                executor.execute(new RecibeServidor(conexion, main, panel)); //client
                executor.execute(new EnviaServidor(conexion, main, panel));
	        } catch (IOException ex) {};
	        executor.shutdown();
		}
		// Si la opcion Salir es seleccionado
		if (e.getSource() == menuItemSalir) {
			System.exit(0);
		}
	}

	private void pintarJuego() {
		PanelJuego panel = new PanelJuego();
		this.addKeyListener(panel);
		this.add(panel);
		this.validate();

	}
	
	public static void main(String[] args) {
		new Principal();
	}

}
